package antlr4.definitive.d1_hello.d1_2_hello.run;

import antlr4.definitive.d1_hello.d1_2_hello.gen.HelloLexer;
import antlr4.definitive.d1_hello.d1_2_hello.gen.HelloParser;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;

public class Hello {
    public static void main(String[] args) throws Exception {
// 读取源代码文件，这里选择直接从字符串读取
        CharStream input = CharStreams.fromString("hello world");
// 创建词法分析器对象 
        HelloLexer lexer = new HelloLexer(input);
// 获取词法分析器输出的tokens
        CommonTokenStream tokens = new CommonTokenStream(lexer);
// 创建语法分析器对象，并将词法分析器输出的tokens作为语法分析器的输入
        HelloParser parser = new HelloParser(tokens);
// 开始分析程序，这也是生成AST的过程
        ParseTree tree = parser.r();    // 文法的入口点r会转换为一个方法，调用该方法，就会自顶向下递归分析源代码
// 创建Visitor对象
        MyHelloVisitor hello = new MyHelloVisitor();
// 开始遍历AST
        hello.visit(tree);
    }
}